package com.uyayo.framework.excelhelper.service;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.List;

/**

 * 利用开源组件POI动态导出EXCEL文档

 * @author hfj

 * @version v1.0

 * @param <T> 应用泛型，代表任意一个符合javabean风格的类

 * byte[]表jpg格式的图片数据

 */
public interface BaseExportExcelService<T> {

    void exportExcel(Workbook workbook, Collection<T> dataset, OutputStream out);

    void exportExcel(Workbook workbook, String[] headers, Collection<T> dataset, OutputStream out);

    void exportExcel(Workbook workbook, String[] headers, Collection<T> dataset, OutputStream out, String pattern);

    void exportExcel(Workbook workbook, String title, String[] headers, String[] fieldNames, Collection<T> dataset, OutputStream out);

    /**
     *
     * 这是一个通用的方法，利用了JAVA的反射机制，可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
     *
     * @param title 表格标题名
     *
     * @param headers 表格属性列名数组
     *
     * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
     *
     * @param out 与输出设备关联的流对象，可以将EXCEL文档导出到本地文件或者网络中
     *
     * @param pattern 如果有时间数据，设定输出格式。默认为"yyy-MM-dd"
     *
     */
    void exportExcel(Workbook workbook, String title, String[] headers, Collection<T> dataset, OutputStream out, String pattern);

    /**
     *
     * 这是一个通用的方法，利用了JAVA的反射机制，并动态的选择表格属性字段，可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
     *
     * @param title 表格标题名
     *
     * @param headers 表格属性列名数组
     *
     * @param fieldNames 表格属性名数组
     *
     * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
     *
     * @param out 与输出设备关联的流对象，可以将EXCEL文档导出到本地文件或者网络中
     *
     * @param pattern 如果有时间数据，设定输出格式。默认为"yyy-MM-dd"
     *
     */
    void exportExcel(Workbook workbook, String title, String[] headers, String[] fieldNames, Collection<T> dataset, OutputStream out, String pattern);


    /**
     * java引用传递的范式，生成多个工作表的excel
     *
     * @param workbook  表格标题名
     * @param sheetNum  工作表序号
     * @param sheetTitle    工作表标题
     * @param headers       表格属性列名数组
     * @param fieldNames    表格属性名数组
     * @param dataset   需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
     * @param pattern   如果有时间数据，设定输出格式。默认为"yyy-MM-dd"
     * @return
     *
     */
    void exportExcel(Workbook workbook, int sheetNum, String sheetTitle, String[] headers, String[] fieldNames,
                     Collection<T> dataset, String pattern);

    /**
     * 生成excel，并把生成的excel文件以流的形式返回
     * @param title 表格标题名
     * @param headers 表格属性列名数组
     * @param fieldNames 表格属性名数组
     * @param dataset   需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
     * @param pattern   如果有时间数据，设定输出格式。默认为"yyy-MM-dd"
     * @return  InputStream
     *
     */
    InputStream getExcelStream(Workbook workbook, String title, String[] headers, String[] fieldNames, Collection<T> dataset, String pattern);

    /**
     * 生成多个工作表的excel，并把生成的excel文件以流的形式返回
     *
     * **此方法暂为测试使用**
     *
     * @param title     表格标题名
     * @param sheetNum  工作表序号集合
     * @param sheetTitle    工作表标题集合
     * @param headers       表格属性列名数组集合
     * @param fieldNames    表格属性名数组集合
     * @param dataset   需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
     * @param pattern   如果有时间数据，设定输出格式。默认为"yyy-MM-dd"
     * @return InputStream
     *
     */
    InputStream getExcelStream(Workbook workbook, String title, List<Integer> sheetNum, List<String> sheetTitle, List<String[]> headers, List<String[]> fieldNames, List<List<T>> dataset, String pattern);

    /**
     * 获取Workbook的公用方法 -动态配置列
     *
     * @param title 表格标题名
     * @param headers 表格属性列名数组
     * @param fieldNames 表格属性名数组-动态配置列
     * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
     * @param pattern 如果有时间数据，设定输出格式。默认为"yyy-MM-dd"
     * @return
     *
     */
    Workbook getWorkbook(Workbook workbook, String title, String[] headers, String[] fieldNames, Collection<T> dataset, String pattern);

    /**
     * @param title 表格标题名
     * @param headers 表格属性列名数组
     * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
     * @param pattern 如果有时间数据，设定输出格式。默认为"yyy-MM-dd"
     * @return
     *
     */
    Workbook getWorkbook(Workbook workbook, String title, String[] headers, Collection<T> dataset, String pattern);

}